package com.itheima.pattern.t21_memento.white_box;

/**
 * 备忘录模式：
 * 又叫快照模式，在不破坏封装性的前提下，捕获一个对象的内部状态，
 * 并在该对象之外保存这个状态，以便以后当需要时能将该对象恢复到原先保存的状态。
 *
 * 白箱备忘录模式：
 * 备忘录角色对任何对象都提供一个接口，即宽接口，备忘录角色的内部所存储的状态就对所有对象公开。
 *
 * 分析：白箱备忘录模式是破坏封装性的。但是通过程序员自律，同样可以在一定程度上实现模式的大部分用意。
 */
public class TestDemo {

    public static void main(String[] args) {
        System.out.println("------------- 大战boss前 -------------");
        // 创建游戏角色对象
        GameRole gameRole = new GameRole();
        gameRole.initState();   // 初始状态操作
        gameRole.stateDisplay();

        // 将该游戏角色内部状态进行备份
        // 创建管理者对象
        RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker();
        roleStateCaretaker.setRoleStateMemento(gameRole.saveState());

        System.out.println("------------- 大战boss后 -------------");
        // 损耗严重
        gameRole.fight();
        gameRole.stateDisplay();

        System.out.println("------------- 恢复之前的状态 -------------");
        gameRole.recoverState(roleStateCaretaker.getRoleStateMemento());
        gameRole.stateDisplay();
    }
}
